<?php 
class Upload{
	//允许的类型
	private $typeArr;
	//允许的大小
	private $size;
	//保存错误信息
	public $error;
	//上传路径
	private $path;
	
	
	/**
	 * 构造函数
	 */
	public function __construct($type=NULL,$size=NULL,$path=NULL){
		//把用户传递的允许类型保存到属性中
		$this->typeArr = is_null($type) ? array('jpg','png','gif','jpeg') : $type;
		//允许大小
		$this->size = is_null($size) ? 1024*1024*2 : 1024*1024*$size;
		//上传路径
		$this->path = is_null($path) ? './Upload' : $path;
	}
	/**
	 * 上传
	 */
	public function up(){
		//1.重组数组,为了把单文件和多文件都可以上传
		$arr = $this->_resetArr();
		//如果有文件上传，因为没有文件被上传所有"重组数组"就会返回空数组
		if($arr){
			foreach ($arr as $pic) {
				//2.筛选合格的才可以上传
				if(!$this->_filter($pic)){
					return false;
				}
			}
		}else{
			$this->error = '没有文件被上传';
			return false;
		}
		
		//如果上面的筛选没有return false 证明所有图片都可以上传
		$path = array();
		//上传全部文件
		foreach($arr as $pic){
			$path[] = $this->_move($pic);
		}
		//返回上传图片的路径
		return $path;
		
	}
	/**
	 * 最后移动上传
	 */
	private function _move($pic){
		//获得类型
		$type = ltrim(strrchr($pic['name'], '.'),'.');
		$filename = time() . mt_rand(0, 9999) . '.' . $type;
		is_dir($this->path) ||  mkdir($this->path,0777,true);
		//完整路径
		$fullPath = $this->path . '/' . $filename;
		//移动上传
		move_uploaded_file($pic['tmp_name'], $fullPath);
		//返回上传之后的完整路径
		return $fullPath;
	}

	/**
	 * 筛选 一定要返回 true 或者 false
	 */
	public function _filter($pic){
		//获得类型,转为小写
		$type = strtolower(ltrim(strrchr($pic['name'], '.'),'.'));
		
		switch (true) {
			//1 文件没有上传
			case $pic['error'] == 4:
				$this->error = '没有文件被上传';
				return false;
			
			//2.不是通过http合法上传
			case !is_uploaded_file($pic['tmp_name']):
				$this->error = '不是一个合法的上传文件';
				return false;
				
			//3.类型不允许
			case !in_array($type, $this->typeArr):
				$this->error = '类型不允许';
				return false;
				
			//4.网站大小不允许
			case $pic['size'] > $this->size:
				$this->error = '文件超过网站配置大小';
				return false;
				
			//5.error错误
			case $pic['error'] == 1:
				$this->error = '大小超过了 php.ini 中 upload_max_filesize 限制值';
				return false;
				
			case $pic['error'] == 2:
				$this->error = '大小超过 HTML 表单中 MAX_FILE_SIZE 选项指定的值';
				return false;
				
			case $pic['error'] == 3:
				$this->error = '文件只有部分被上传。';
				return false;			
			default:
				return true;
		}
		
	}
	
	
	/**
	 * 重组数组
	 */
	private function _resetArr(){
		$temp = array();
		foreach ($_FILES as $v) {
			//如果是多文件上传
			if(is_array($v['name'])){
				foreach ($v['name'] as $key => $value) {
					$temp[] = array(
						'name' => $value,
						'type' => $v['type'][$key],
						'tmp_name'=> $v['tmp_name'][$key],
						'error'=> $v['error'][$key],
						'size'=> $v['size'][$key],
					);
				}
			}else{
				//单文件上传
				$temp[] = $v;
			}
			
		}
		return $temp;
	}
	
	
}

?>
